Telegram Group & Telegram Channel
🐍 Задача с подвохом для продвинутых Python-разработчиков

🔹 Уровень: Advanced
🔹 Темы: особенности defaultdict, побочные эффекты, mutability, ловушки с list и dict

📌 Условие

Рассмотрим следующий код:


from collections import defaultdict

def make_dict():
return {"count": 0}

d = defaultdict(make_dict)

d["a"]["count"] += 1
d["b"]["count"] += 1
d["a"]["count"] += 1

print(d)


Вопросы

1. Что будет выведено на экран?
2. Почему результат может оказаться неожиданным при использовании других вариантов реализации?
3. Что изменится, если использовать make_dict() без функции-обёртки?

🔍 Разбор

Ожидаемый вывод:

defaultdict(<function make_dict at 0x...>, {'a': {'count': 2}, 'b': {'count': 1}})


🔧 Почему так происходит

- defaultdict вызывает make_dict() каждый раз, когда ключа нет в словаре.
- Для каждого нового ключа (`"a"` и "b"`) создаётся **новый** словарь `{"count": 0}.
- d["a"]["count"] += 1 увеличивает значение "count" у собственного словаря a.

⚠️ Подвох

Если бы вместо make_dict использовали один и тот же объект (например, через `lambda: some_dict`), то все ключи ссылались бы на один и тот же словарь — и значения начали бы "перетекать" между ключами:


shared = {"count": 0}
d = defaultdict(lambda: shared)


Тогда итог мог бы быть таким:

{'a': {'count': 2}, 'b': {'count': 2}} # неожиданно!


🧠 Вывод

- Никогда не используйте изменяемый объект напрямую как значение по умолчанию в defaultdict.
- Используй функции-фабрики, чтобы избежать общих ссылок между элементами.
- Проверяй поведение при работе со сложными структурами (`list`, `dict`) в качестве значений по умолчанию.


# Правильно:
defaultdict(lambda: {"count": 0})

# Ошибочно:
defaultdict(lambda: some_shared_dict)


📌 Используй copy.deepcopy() или фабричные функции, если создаёшь вложенные структуры.



tg-me.com/pro_python_code/1809
Create:
Last Update:

🐍 Задача с подвохом для продвинутых Python-разработчиков

🔹 Уровень: Advanced
🔹 Темы: особенности defaultdict, побочные эффекты, mutability, ловушки с list и dict

📌 Условие

Рассмотрим следующий код:


from collections import defaultdict

def make_dict():
return {"count": 0}

d = defaultdict(make_dict)

d["a"]["count"] += 1
d["b"]["count"] += 1
d["a"]["count"] += 1

print(d)


Вопросы

1. Что будет выведено на экран?
2. Почему результат может оказаться неожиданным при использовании других вариантов реализации?
3. Что изменится, если использовать make_dict() без функции-обёртки?

🔍 Разбор

Ожидаемый вывод:

defaultdict(<function make_dict at 0x...>, {'a': {'count': 2}, 'b': {'count': 1}})


🔧 Почему так происходит

- defaultdict вызывает make_dict() каждый раз, когда ключа нет в словаре.
- Для каждого нового ключа (`"a"` и "b"`) создаётся **новый** словарь `{"count": 0}.
- d["a"]["count"] += 1 увеличивает значение "count" у собственного словаря a.

⚠️ Подвох

Если бы вместо make_dict использовали один и тот же объект (например, через `lambda: some_dict`), то все ключи ссылались бы на один и тот же словарь — и значения начали бы "перетекать" между ключами:


shared = {"count": 0}
d = defaultdict(lambda: shared)


Тогда итог мог бы быть таким:

{'a': {'count': 2}, 'b': {'count': 2}} # неожиданно!


🧠 Вывод

- Никогда не используйте изменяемый объект напрямую как значение по умолчанию в defaultdict.
- Используй функции-фабрики, чтобы избежать общих ссылок между элементами.
- Проверяй поведение при работе со сложными структурами (`list`, `dict`) в качестве значений по умолчанию.


# Правильно:
defaultdict(lambda: {"count": 0})

# Ошибочно:
defaultdict(lambda: some_shared_dict)


📌 Используй copy.deepcopy() или фабричные функции, если создаёшь вложенные структуры.

BY Python RU


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/pro_python_code/1809

View MORE
Open in Telegram


Python RU Telegram | DID YOU KNOW?

Date: |

Telegram auto-delete message, expiring invites, and more

elegram is updating its messaging app with options for auto-deleting messages, expiring invite links, and new unlimited groups, the company shared in a blog post. Much like Signal, Telegram received a burst of new users in the confusion over WhatsApp’s privacy policy and now the company is adopting features that were already part of its competitors’ apps, features which offer more security and privacy. Auto-deleting messages were already possible in Telegram’s encrypted Secret Chats, but this new update for iOS and Android adds the option to make messages disappear in any kind of chat. Auto-delete can be enabled inside of chats, and set to delete either 24 hours or seven days after messages are sent. Auto-delete won’t remove every message though; if a message was sent before the feature was turned on, it’ll stick around. Telegram’s competitors have had similar features: WhatsApp introduced a feature in 2020 and Signal has had disappearing messages since at least 2016.

A project of our size needs at least a few hundred million dollars per year to keep going,” Mr. Durov wrote in his public channel on Telegram late last year. “While doing that, we will remain independent and stay true to our values, redefining how a tech company should operate.

Python RU from jp


Telegram Python RU
FROM USA